package com.gsi.webstore.platform.storefront.capi.basket;

import java.math.BigDecimal;
import java.util.Collection;

import com.gsi.webstore.platform.storefront.capi.order.GSITaxInformationBO;
import com.intershop.beehive.core.capi.businessobject.BusinessObjectExtension;
import com.intershop.sellside.appbase.b2c.capi.order.Discount;
import com.intershop.sellside.appbase.b2c.capi.order.ProductLineItemBO;

/**
 * @author Martin Boehmer
 *
 */
public interface ProductConfigurationLineItemBOGSIExtension extends BusinessObjectExtension
{
    /**
     * Returns the data to be filled into order service XML element OrderCreateRequest/Order/OrderItems/OrderItem/Customization/Customizations/Customization/CustomizationId.
     * This XML element is OPTIONAL.
     * 
     * @return data for OrderItem/Customization/Customizations/Customization/CustomizationId
     */
    public String getOrderServiceCustomizationId();


    
    /**
     * Returns the data to be filled into order service XML element OrderCreateRequest/Order/OrderItems/OrderItem/Customization/Customizations/Customization/Instructions/Instructions/Key.
     * This XML element is REQUIRED.
     * 
     * @return data for OrderItem/Customization/Customizations/Customization/Instructions/Instructions/Key
     */
    public String getOrderServiceInstructionKey();
    
    /**
     * Returns the data to be filled into order service XML element OrderCreateRequest/Order/OrderItems/OrderItem/Customization/Customizations/Customization/Instructions/Instructions/Value.
     * This XML element is REQUIRED.
     * 
     * @return data for OrderItem/Customization/Customizations/Customization/Instructions/Instructions/Value
     */
    public String getOrderServiceInstructionValue();
    
    /**
     * Returns the data to be filled into order service XML element OrderCreateRequest/Order/OrderItems/OrderItem/Customization/Customizations/Customization/Instructions/Instruction/DisplayTitle.
     * This XML element is OPTIONAL.
     * 
     * @return data for OrderItem/Customization/Customizations/Customization/Instructions/Instruction/DisplayTitle
     */
    public String getOrderServiceInstructionDisplayTitle();
    
    /**
     * Returns the data to be filled into order service XML element OrderCreateRequest/Order/OrderItems/OrderItem/Customization/Customizations/Customization/Instructions/Instruction/DisplayValue.
     * This XML element is OPTIONAL.
     * 
     * @return data for OrderItem/Customization/Customizations/Customization/Instructions/Instruction/DisplayValue
     */
    public String getOrderServiceInstructionDisplayValue();


    
    /**
     * Returns if data is available to be filled into order service XML element OrderCreateRequest/Order/OrderItems/OrderItem/Customization/Customizations/Customization/ExtendedPrice.
     * This XML element is OPTIONAL.
     * If no data is available then this XML element is omitted.
     * 
     *     <PriceGroup>
     *         <Amount /> (optional; xsd:decimal fractionDigits=2) <!-- Represents a decimal currency with two decimal points. Sample value: 4.20 -->
     *         <PromotionalDiscounts> (optional)
     *              <Discount> (required, can occur multiple times; type="PromoDiscount")
     *         </PromotionalDiscounts>
     *         <TaxData> (optional)
     *              <TaxClass /> (optional; xsd:int)
     *              <Taxes> (optional)
     *                  <Tax> (required, can occur multiple times; type="Tax")
     *              </Taxes>
     *         </TaxData>
     *         <UnitPrice /> (optional; xsd:decimal fractionDigits=2) <!-- Represents a decimal currency with two decimal points. Sample value: 4.20 -->
     *     </PriceGroup>
     * 
     * @param baseProductLineItemBO  the parent PLI, the PLI of the base product
     * 
     * @return true if data for OrderItem/Customization/Customizations/Customization/ExtendedPrice is available, false if this XML element should be omitted
     */
    public boolean hasOrderServiceInstructionExtendedPrice(ProductLineItemBO baseProductLineItemBO);

    
    /**
     * Returns the data to be filled into order service XML element OrderCreateRequest/Order/OrderItems/OrderItem/Customization/Customizations/Customization/ExtendedPrice/Amount.
     * This XML element is OPTIONAL.
     * 
     * @param baseProductLineItemBO  the parent PLI, the PLI of the base product
     * 
     * @return data for OrderItem/Customization/Customizations/Customization/ExtendedPrice/Amount
     */
    public BigDecimal getOrderServiceInstructionExtendedPriceAmount(ProductLineItemBO baseProductLineItemBO);

    
//    /**
//     * Returns the data to be filled into order service XML element OrderCreateRequest/Order/OrderItems/OrderItem/Customization/Customizations/Customization/ExtendedPrice/PromotionalDiscounts.
//     * This XML element is OPTIONAL.
//     * Each element in the returned collection is used to create one OrderItem/Customization/Customizations/Customization/ExtendedPrice/PromotionalDiscounts/Discount XML element.
//     * 
//     * @param baseProductLineItemBO  the parent PLI, the PLI of the base product
//     * 
//     * @return data for OrderItem/Customization/Customizations/Customization/ExtendedPrice/PromotionalDiscounts, may return null or an empty collection
//     */
//    public Collection<Discount> getOrderServiceInstructionExtendedPricePromotionalDiscounts(ProductLineItemBO baseProductLineItemBO);

    
    /**
     * Returns the data to be filled into order service XML element OrderCreateRequest/Order/OrderItems/OrderItem/Customization/Customizations/Customization/ExtendedPrice/TaxData/TaxClass.
     * This XML element is OPTIONAL.
     * 
     * @param baseProductLineItemBO  the parent PLI, the PLI of the base product
     * 
     * @return data for OrderItem/Customization/Customizations/Customization/ExtendedPrice/TaxData/TaxClass
     */
    public String getOrderServiceInstructionExtendedPriceTaxDataTaxClass(ProductLineItemBO baseProductLineItemBO);
    
    /**
     * Returns the data to be filled into order service XML element OrderCreateRequest/Order/OrderItems/OrderItem/Customization/Customizations/Customization/ExtendedPrice/TaxData/Taxes.
     * This XML element is OPTIONAL.
     * Each element in the returned collection is used to create one OrderItem/Customization/Customizations/Customization/ExtendedPrice/TaxData/Taxes/Tax XML element.
     * 
     * @param baseProductLineItemBO  the parent PLI, the PLI of the base product
     * 
     * @return data for OrderItem/Customization/Customizations/Customization/ExtendedPrice/TaxData/Taxes, may return null or an empty collection
     */
    public Collection<GSITaxInformationBO> getOrderServiceInstructionExtendedPriceTaxDataTaxes(ProductLineItemBO baseProductLineItemBO);

    
    /**
     * Returns the data to be filled into order service XML element OrderCreateRequest/Order/OrderItems/OrderItem/Customization/Customizations/Customization/ExtendedPrice/UnitPrice.
     * This XML element is OPTIONAL.
     * 
     * @param baseProductLineItemBO  the parent PLI, the PLI of the base product
     * 
     * @return data for OrderItem/Customization/Customizations/Customization/ExtendedPrice/UnitPrice
     */
    public BigDecimal getOrderServiceInstructionExtendedPriceUnitPrice(ProductLineItemBO baseProductLineItemBO);

    
    
    /**
     * Returns the data to be filled into order service XML element OrderCreateRequest/Order/OrderItems/OrderItem/Customization/Customizations/Customization/ItemId.
     * This XML element is OPTIONAL.
     * 
     * @return data for OrderItem/Customization/Customizations/Customization/ItemId
     */
    public String getOrderServiceCustomizationItemId();

    
    /**
     * Returns the data to be filled into order service XML element OrderCreateRequest/Order/OrderItems/OrderItem/Customization/Customizations/Customization/Item.
     * This XML element is OPTIONAL.
     * 
     * @return data for OrderItem/Customization/Customizations/Customization/Item
     */
    public String getOrderServiceCustomizationItem();

    
    
    /**
     * Returns if data is available to be filled into order service XML element OrderCreateRequest/Order/OrderItems/OrderItem/Customization/BasePrice.
     * This XML element is OPTIONAL.
     * If no data is available then this XML element is omitted.
     * 
     *     <PriceGroup>
     *         <Amount /> (optional; xsd:decimal fractionDigits=2) <!-- Represents a decimal currency with two decimal points. Sample value: 4.20 -->
     *         <PromotionalDiscounts> (optional)
     *              <Discount> (required, can occur multiple times; type="PromoDiscount")
     *         </PromotionalDiscounts>
     *         <TaxData> (optional)
     *              <TaxClass /> (optional; xsd:int)
     *              <Taxes> (optional)
     *                  <Tax> (required, can occur multiple times; type="Tax")
     *              </Taxes>
     *         </TaxData>
     *         <UnitPrice /> (optional; xsd:decimal fractionDigits=2) <!-- Represents a decimal currency with two decimal points. Sample value: 4.20 -->
     *     </PriceGroup>
     * 
     * @param baseProductLineItemBO  the parent PLI, the PLI of the base product
     * 
     * @return true if data for OrderItem/Customization/BasePrice is available, false if this XML element should be omitted
     */
    public boolean hasOrderServiceBasePrice(ProductLineItemBO baseProductLineItemBO);

    
    /**
     * Returns the data to be filled into order service XML element OrderCreateRequest/Order/OrderItems/OrderItem/Customization/BasePrice/Amount.
     * This XML element is OPTIONAL.
     * 
     * @param baseProductLineItemBO  the parent PLI, the PLI of the base product
     * 
     * @return data for OrderItem/Customization/BasePrice/Amount
     */
    public BigDecimal getOrderServiceBasePriceAmount(ProductLineItemBO baseProductLineItemBO);

    
//    /**
//     * Returns the data to be filled into order service XML element OrderCreateRequest/Order/OrderItems/OrderItem/Customization/BasePrice/PromotionalDiscounts.
//     * This XML element is OPTIONAL.
//     * Each element in the returned collection is used to create one OrderItem/Customization/BasePrice/PromotionalDiscounts/Discount XML element.
//     * 
//     * @param baseProductLineItemBO  the parent PLI, the PLI of the base product
//     * 
//     * @return data for OrderItem/Customization/BasePrice/PromotionalDiscounts, may return null or an empty collection
//     */
//    public Collection<GSITaxInformationBO> getOrderServiceBasePricePromotionalDiscounts(ProductLineItemBO baseProductLineItemBO);

    
    /**
     * Returns the data to be filled into order service XML element OrderCreateRequest/Order/OrderItems/OrderItem/Customization/BasePrice/TaxData/TaxClass.
     * This XML element is OPTIONAL.
     * 
     * @param baseProductLineItemBO  the parent PLI, the PLI of the base product
     * 
     * @return data for OrderItem/Customization/BasePrice/TaxData/TaxClass
     */
    public String getOrderServiceBasePriceTaxDataTaxClass(ProductLineItemBO baseProductLineItemBO);
    
    /**
     * Returns the data to be filled into order service XML element OrderCreateRequest/Order/OrderItems/OrderItem/Customization/BasePrice/TaxData/Taxes.
     * This XML element is OPTIONAL.
     * Each element in the returned collection is used to create one OrderItem/Customization/BasePrice/TaxData/Taxes/Tax XML element.
     * 
     * @param baseProductLineItemBO  the parent PLI, the PLI of the base product
     * 
     * @return data for OrderItem/Customization/BasePrice/TaxData/Taxes, may return null or an empty collection
     */
    public Collection<GSITaxInformationBO> getOrderServiceBasePriceTaxDataTaxes(ProductLineItemBO baseProductLineItemBO);

    
    /**
     * Returns the data to be filled into order service XML element OrderCreateRequest/Order/OrderItems/OrderItem/Customization/BasePrice/UnitPrice.
     * This XML element is OPTIONAL.
     * 
     * @param baseProductLineItemBO  the parent PLI, the PLI of the base product
     * 
     * @return data for OrderItem/Customization/BasePrice/UnitPrice
     */
    public BigDecimal getOrderServiceBasePriceUnitPrice(ProductLineItemBO baseProductLineItemBO);

    
    
    /**
     * Returns the data to be filled into order service XML element OrderCreateRequest/Order/OrderItems/OrderItem/Customization/DisplayUrl.
     * This XML element is OPTIONAL.
     * 
     * @return data for OrderItem/Customization/DisplayUrl
     */
    public String getOrderServiceDisplayUrl();
}
